package com.promise.jokerdream.response.parser

import org.jsoup.Jsoup

/**
 * XML解析结果
 * @param isSuccess 解析是否成功
 * @param data 解析出的数据
 */
data class XmlParseResult<T>(
    val isSuccess: Boolean,
    val data: T? = null,
    val errorMessage: String? = null
)

/**
 * XML解析器基类
 * 提供通用的XML解析功能和规则检查
 */
abstract class BaseXmlParser<T> {
    
    /**
     * 解析XML字符串
     * @param xmlString XML字符串
     * @return 解析结果
     */
    fun parseXml(xmlString: String): XmlParseResult<T> {
        return try {
            // 首先检查是否包含规则标识，如果包含则认为失败
            val ruleMessage = getRuleMessage(xmlString)
            if (ruleMessage != null) {
                return XmlParseResult(
                    isSuccess = false,
                    errorMessage = ruleMessage
                )
            }
            
            // 没有规则标识，执行具体解析逻辑
            val data = doParse(xmlString)
            XmlParseResult(
                isSuccess = true,
                data = data
            )
        } catch (e: Exception) {
            XmlParseResult(
                isSuccess = false,
                errorMessage = "解析失败: ${e.message}"
            )
        }
    }
    
    /**
     * 获取规则消息内容
     * 检查div#id的第一个p标签是否为规则标识，如果是则从第二个p标签提取第一个文本节点
     * @param xmlString XML字符串
     * @return 规则消息内容，如果不包含则返回null
     */
    private fun getRuleMessage(xmlString: String): String? {
        return try {
            val doc = Jsoup.parse(xmlString)
            val divElement = doc.selectFirst("div#id")
            
            if (divElement != null) {
                val pElements = divElement.select("p")
                
                // 检查是否有至少两个p标签
                if (pElements.size >= 2) {
                    val firstP = pElements[0]
                    val secondP = pElements[1]
                    
                    // 检查第一个p标签的文本内容是否为规则标识
                    val firstPText = firstP.text().trim()
                    if (isRuleIdentifier(firstPText)) {
                        // 从第二个p标签中提取第一个文本节点
                        return extractFirstTextNode(secondP)
                    }
                }
            }
            null
        } catch (e: Exception) {
            // 解析失败时，假设不包含规则标识
            null
        }
    }
    
    /**
     * 检查是否为规则标识
     * 子类可以重写此方法来自定义规则标识
     * @param text 要检查的文本
     * @return 是否为规则标识
     */
    protected open fun isRuleIdentifier(text: String): Boolean {
        val ruleList = listOf(
            "【使用规则】",
        )
        return ruleList.contains(text)
    }
    
    /**
     * 从元素中提取第一个文本节点
     * @param element 要提取的元素
     * @return 第一个文本节点的内容，如果没有则返回null
     */
    private fun extractFirstTextNode(element: org.jsoup.nodes.Element): String? {
        // 获取所有文本节点
        val textNodes = element.textNodes()
        
        // 如果直接有文本节点，返回第一个
        if (textNodes.isNotEmpty()) {
            return textNodes[0].text().trim()
        }
        
        return null
    }
    
    /**
     * 子类需要实现的具体解析逻辑
     * @param xmlString XML字符串
     * @return 解析出的数据
     */
    protected abstract fun doParse(xmlString: String): T
}
